﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SharpSoft.Lexing
{
    public interface ITextSource
    {
        /// <summary>
        /// 获取当前位置的字符
        /// </summary>
        char Current { get; }
        /// <summary>
        /// 获取当前源的长度（字符个数）
        /// </summary>
        UInt32 Length { get; }
        /// <summary>
        /// 是否已经到文本源的结尾，通常如果游标位于最后一个字符之后或游标当前指示的字符为'\0'则认为文本源已经结束。
        /// 在实现该接口时应确保文本源结束后游标置于文本源的最后一个字符的后一个位置上。
        /// </summary>
        /// <returns></returns>
        bool EOS();
        /// <summary>
        /// 获取或设置当前游标位置
        /// </summary>
        int Position { get; set; }
        /// <summary>
        /// 将游标置于当前位置的指定偏移处。并返回该位置的字符
        /// </summary>
        /// <param name="offset"></param>
        /// <returns></returns>
        char Next(int offset = 1);
        /// <summary>
        /// 查看相对于当前位置指定偏移处的字符
        /// </summary>
        /// <param name="offset"></param>
        /// <returns></returns>
        char Peek(int offset = 1);
        /// <summary>
        /// 获取指定位置处的字符
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        char Get(int index);
        /// <summary>
        /// 将游标置于指定位置
        /// </summary>
        /// <param name="index"></param>
        void Set(int index);
        /// <summary>
        /// 重置游标到文本源起始位置
        /// </summary>
        void ResetCursor();
        /// <summary>
        /// 将游标置于当前位置的指定偏移处
        /// </summary>
        /// <param name="offset">指定偏移量，默认为1</param>
        void MoveCursor(int offset = 1);
    }
}
